package pe.edu.upc.e41a.javasoft.jsf;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.CloseEvent;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;

import pe.edu.upc.e41a.javasoft.domain.Categoria;
import pe.edu.upc.e41a.javasoft.domain.Imagen;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;
import pe.edu.upc.e41a.javasoft.domain.Transaccion;
import pe.edu.upc.e41a.javasoft.domain.Usuario;
import pe.edu.upc.e41a.javasoft.domain.Visita;
import pe.edu.upc.e41a.javasoft.jsf.util.Util;
import pe.edu.upc.e41a.javasoft.service.CategoriaService;
import pe.edu.upc.e41a.javasoft.service.ImagenService;
import pe.edu.upc.e41a.javasoft.service.PublicacionService;
import pe.edu.upc.e41a.javasoft.service.UsuarioService;

@Configurable
@ManagedBean(name = "publicacionBean")
@SessionScoped
@RooSerializable
@RooJsfManagedBean(entity = Publicacion.class, beanName = "publicacionBean")
public class PublicacionBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	PublicacionService publicacionService;

	@Autowired
	CategoriaService categoriaService;

	@Autowired
	UsuarioService usuarioService;

	@Autowired
	ImagenService imagenService;

	private String name = "Publicacions";

	private Publicacion publicacion;
	private Categoria categoria;
	private Usuario usuarioSession;
	private Imagen imagen01;
	private Imagen imagen02;
	private Imagen imagen03;
	//private Imagen imagen;

	private List<Publicacion> allPublicacions;
	private List<Publicacion> imagenPublicacion;

	private boolean dataVisible = false;

	private List<String> columns;

	private boolean createDialogVisible = false;

	private List<Imagen> selectedImagens;

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Usuario getUsuarioSession() {
		return usuarioSession;
	}

	public void setUsuarioSession(Usuario usuarioSession) {
		this.usuarioSession = usuarioSession;
	}

	private List<Transaccion> selectedTransaccions;

	private List<Visita> selectedVisitas;

	// private String destinoPath="D:\\tmp\\tmp\\";
	private String destinoPath;

	// private String destinoPath;

	private TreeNode selectedNode;

	@PostConstruct
	public void init() {
		columns = new ArrayList<String>();
		columns.add("titulo");
		columns.add("descripcion");
		columns.add("tipo");
		columns.add("cantidad");
		columns.add("precio");
		obtenerDestinoPath();
		

		
	}

	public String getName() {
		return name;
	}

	public List<String> getColumns() {
		return columns;
	}

	public List<Publicacion> getAllPublicacions() {
		return allPublicacions;
	}

	public void setAllPublicacions(List<Publicacion> allPublicacions) {
		this.allPublicacions = allPublicacions;
	}

	public String findAllPublicacions() {
		// allPublicacions = publicacionService.findAllPublicacions();
		fijarImagen();
		// dataVisible = !allPublicacions.isEmpty();
		return null;
	}

	// cerrar panel
	public void handleClose(CloseEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
				"Panel Closed", "Closed panel id:'"
						+ event.getComponent().getId() + "'");

		addMessage(message);
	}

	private void addMessage(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	// cargar archivo
	public void handleFileUpload(FileUploadEvent event) {
		FacesMessage msg = new FacesMessage("Succesful", event.getFile()
				.getFileName() + " is uploaded.");
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public boolean isDataVisible() {
		return dataVisible;
	}

	public void setDataVisible(boolean dataVisible) {
		this.dataVisible = dataVisible;
	}

	public Publicacion getPublicacion() {
		if (publicacion == null) {
			publicacion = new Publicacion();
		}
		return publicacion;
	}

	public void setPublicacion(Publicacion publicacion) {
		this.publicacion = publicacion;
	}

	public Imagen getImagen01() {
		if (imagen01 == null) {
			imagen01 = new Imagen();
		}
		return imagen01;
	}

	public void setImagen01(Imagen imagen01) {
		this.imagen01 = imagen01;
	}

	public Imagen getImagen02() {
		if (imagen02 == null) {
			imagen02 = new Imagen();
		}
		return imagen02;
	}

	public void setImagen02(Imagen imagen02) {
		this.imagen02 = imagen02;
	}

	public Imagen getImagen03() {
		if (imagen03 == null) {
			imagen03 = new Imagen();
		}
		return imagen03;
	}

	public void setImagen03(Imagen imagen03) {
		this.imagen03 = imagen03;
	}

	// aqui esta selccionando imagenes no?
	public List<Imagen> getSelectedImagens() {
		return selectedImagens;
	}

	public void setSelectedImagens(List<Imagen> selectedImagens) {
		if (selectedImagens != null) {
			publicacion.setImagens(new HashSet<Imagen>(selectedImagens));
		}
		this.selectedImagens = selectedImagens;
	}

	public List<Transaccion> getSelectedTransaccions() {
		return selectedTransaccions;
	}

	public void setSelectedTransaccions(List<Transaccion> selectedTransaccions) {
		if (selectedTransaccions != null) {
			publicacion.setTransaccions(new HashSet<Transaccion>(
					selectedTransaccions));
		}
		this.selectedTransaccions = selectedTransaccions;
	}

	public List<Visita> getSelectedVisitas() {
		return selectedVisitas;
	}

	public void setSelectedVisitas(List<Visita> selectedVisitas) {
		if (selectedVisitas != null) {
			publicacion.setVisitas(new HashSet<Visita>(selectedVisitas));
		}
		this.selectedVisitas = selectedVisitas;
	}

	public List<Categoria> completeCategoria(String query) {
		List<Categoria> suggestions = new ArrayList<Categoria>();
		for (Categoria categoria : categoriaService.findAllCategorias()) {
			String categoriaStr = String.valueOf(categoria.getNombre() + " "
					+ categoria.getDescripcion());
			if (categoriaStr.toLowerCase().startsWith(query.toLowerCase())) {
				suggestions.add(categoria);
			}
		}
		return suggestions;
	}

	public List<Usuario> completeUsuario(String query) {
		List<Usuario> suggestions = new ArrayList<Usuario>();
		for (Usuario usuario : usuarioService.findAllUsuarios()) {
			String usuarioStr = String.valueOf(usuario.getNombres() + " "
					+ usuario.getApellidoPaterno() + " "
					+ usuario.getApellidoMaterno() + " " + usuario.getSexo());
			if (usuarioStr.toLowerCase().startsWith(query.toLowerCase())) {
				suggestions.add(usuario);
			}
		}
		return suggestions;
	}

	public String onEdit() {
		if (publicacion != null && publicacion.getImagens() != null) {
			selectedImagens = new ArrayList<Imagen>(publicacion.getImagens());
		}
		if (publicacion != null && publicacion.getTransaccions() != null) {
			selectedTransaccions = new ArrayList<Transaccion>(
					publicacion.getTransaccions());
		}
		if (publicacion != null && publicacion.getVisitas() != null) {
			selectedVisitas = new ArrayList<Visita>(publicacion.getVisitas());
		}
		return null;
	}

	public boolean isCreateDialogVisible() {
		return createDialogVisible;
	}

	public void setCreateDialogVisible(boolean createDialogVisible) {
		this.createDialogVisible = createDialogVisible;
	}

	public String displayList() {
		createDialogVisible = false;
		findAllPublicacions();
		return "busquedaPublicacionResultado";
	}

	public String displayCreateDialog() {
		publicacion = new Publicacion();
		// createDialogVisible = true;
		return "publicacion";
	}

	public String registrarPublicacion() {
		publicacion = new Publicacion();
		publicacion.setFechaCreacion(Util.stringToDate("16/06/2012"));
		publicacion.setEstado('1');
		imagen01 = new Imagen();
		imagen03 = new Imagen();
		imagen02 = new Imagen();

		return "publicacion";
	}

	public String persist() {
		String message = "";
		fijarCategoria();
		fijarUsuarioSession();

		if (publicacion.getCodigo() != null) {
			publicacionService.updatePublicacion(publicacion);
			message = "Successfully updated";
		} else {
			message = publicacionService.registrarPublicacion(publicacion);// aqui
																			// hace
																			// guardar
			// message = "Successfully created";
		}

		if (message.equalsIgnoreCase("La publicación se registró exitosamente")) {
			guardarImagen(publicacion);
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_INFO, "SYSTEM", message);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
			reset();

		} else {
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "SYSTEM", message);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		}
		return findAllPublicacions();
	}


	// Mostrar Publicacion .
	public Publicacion BuscarPublicacion(Publicacion publicacion) {// asi seria?
																	// si
		publicacion = publicacionService.findPublicacion(publicacion
				.getCodigo());
		return publicacion;

	}

	//Mostrar Publicacion .
	public String mostrar()
	{
		buscarPublicacion(publicacion);
		System.out.println(publicacion.getTitulo());
		return "publicacionMostrar.xhtml?faces-redirect=true";
	}
	
		public Publicacion buscarPublicacion(Publicacion publicacion)
		{//asi 
			
			publicacion=publicacionService.findPublicacion(publicacion.getCodigo());	
			System.out.println(publicacion.getTitulo());
			
			return publicacion;
			
			
		}
		
	//Mostrar Imagen
		 public Imagen BuscarImagen()
		 {
			 imagen01=imagenService.buscarImagen(publicacion);
			 return imagen01;
			 
		 }

	// Mostrar Imagen
	/*public Imagen BuscarImagen() {
		Imagen imagen = imagenService.buscarImagen(publicacion);
		return imagen;

	}*/


	

	public String delete() {
		publicacionService.deletePublicacion(publicacion);
		FacesMessage facesMessage = new FacesMessage("Successfully deleted");
		FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		reset();
		return findAllPublicacions();
	}

	public void reset() {
		publicacion = new Publicacion();
		selectedImagens = null;
		selectedTransaccions = null;
		selectedVisitas = null;
		createDialogVisible = false;
		// usuarioSession=null;
		categoria = null;
		imagen01 = new Imagen();
		imagen02 = new Imagen();
		imagen03 = new Imagen();

	}

	public void handleDialogClose(CloseEvent event) {
		reset();
	}

	public String guardarImagen(Publicacion publicacion) {

		if (imagen01 != null) {
			imagen01.setPublicacion(publicacion);
			imagenService.saveImagen(imagen01);
		}
		if (imagen02 != null) {
			imagen02.setPublicacion(publicacion);
			imagenService.saveImagen(imagen02);
		}
		if (imagen03 != null) {
			imagen03.setPublicacion(publicacion);
			imagenService.saveImagen(imagen03);
		}

		return null;

	}

	public void upload(FileUploadEvent event) {

		try {

			copyFile(event.getFile().getFileName(), event.getFile()
					.getInputstream());
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void copyFile(String fileName, InputStream in) {
		try {

			// write the inputStream to a FileOutputStream
			if (imagen01.getNombre() == null) {
				imagen01.setNombre(fileName);
				System.out.println(fileName + "clase imagen 01");
			} else if (imagen01.getNombre() != null) {
				if (imagen02.getNombre() == null) {
					imagen02.setNombre(fileName);
					System.out.println(fileName + "clase imagen 02");
				} else {
					if (imagen03.getNombre() == null) {
						imagen03.setNombre(fileName);
						System.out.println(fileName + "clase imagen 03");
					}
				}
			}

			OutputStream out = new FileOutputStream(new File(destinoPath
					+ fileName));

			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = in.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}

			in.close();
			out.flush();
			out.close();

			System.out.println("New file created!");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

	public String onNodeSelect() {
		String nodoSeleccionado;

		nodoSeleccionado = selectedNode.getData().toString();

		System.out.println(nodoSeleccionado);
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
				"Selected", nodoSeleccionado);

		FacesContext.getCurrentInstance().addMessage(null, message);
		return null;
	}

	public TreeNode getSelectedNode() {
		return selectedNode;
	}

	public void setSelectedNode(TreeNode selectedNode) {

		this.selectedNode = selectedNode;
	}

	public void fijarCategoria() {
		String nodo = selectedNode.getData().toString();
		categoria = categoriaService.buscarCategoriaPorNombre(nodo);
		publicacion.setCategoria(categoria);
	}

	public void obtenerDestinoPath() {
		if (destinoPath == null) {
			FacesContext mContext = FacesContext.getCurrentInstance();
			destinoPath = mContext.getExternalContext().getRealPath(
					"//resources//publicacionImagen/");
			destinoPath = destinoPath + "\\";
			System.out.println(destinoPath);
		}
	}

	public void fijarUsuarioSession() {
		FacesContext context = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) context.getExternalContext()
				.getSession(false);
		usuarioSession = ((Usuario) session.getAttribute("usuarioSession"));
		publicacion.setUsuario(usuarioSession);
		System.out.println("El usuario en sessión es: "
				+ usuarioSession.getUsuario());

	}

	public void fijarImagen() {
		List<Publicacion> listaPublicacion = publicacionService
				.findAllPublicacions();
		System.out.println(listaPublicacion.size() + "publicaciones");

		ArrayList lista = new ArrayList();
		if (listaPublicacion.size() > 0) {
			System.out.println(listaPublicacion.size());
			for (Iterator iterator = listaPublicacion.iterator(); iterator
					.hasNext();) {
				Publicacion publicacion = (Publicacion) iterator.next();
				List<Imagen> listaImagenPublicacion = imagenService
						.buscarImagenes(publicacion);
				System.out.println(listaImagenPublicacion.size()
						+ "lista interna");

				if (listaImagenPublicacion.size() > 0) {
					publicacion.setNombreimagen("/resources/publicacionImagen/"+listaImagenPublicacion.get(0)
							.getNombre());
					System.out.println(publicacion.getNombreimagen());
					lista.add(publicacion);

				} else {
					publicacion.setNombreimagen("Sin Imagen");
					lista.add(publicacion);
				}

			}

			allPublicacions = lista;
			dataVisible = !allPublicacions.isEmpty();
		}

	}

	public List<Publicacion> getImagenPublicacion() {
		return imagenPublicacion;
	}

	public void setImagenPublicacion(List<Publicacion> imagenPublicacion) {
		this.imagenPublicacion = imagenPublicacion;
	}

}